From: Florian Müllner Date: Thu, 15 Dec 2011 13:46:12 +0000 (+0100) Subject: overview: Load RemoteSearchProviders X-Git-Tag: archive/raspbian/50.5-1+rpi1~1^2~1013^2^2~6993 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=34c6ff96454dbe3d8d2b959834a68fb050b8fe2f;p=gnome-shell.git overview: Load RemoteSearchProviders Allow applications to register search providers by dropping a keyfile into a well-known directory. For now, initialize all found providers; long term, we probably want to give users the ability to restrict the set of active search providers. https://bugzilla.gnome.org/show_bug.cgi?id=663125 --- diff --git a/js/ui/overview.js b/js/ui/overview.js index 566d3f1a4..9db4c3d1d 100644 --- a/js/ui/overview.js +++ b/js/ui/overview.js @@ -21,6 +21,7 @@ const MessageTray = imports.ui.messageTray; const Panel = imports.ui.panel; const Params = imports.misc.params; const PlaceDisplay = imports.ui.placeDisplay; +const RemoteSearch = imports.ui.remoteSearch; const Tweener = imports.ui.tweener; const ViewSelector = imports.ui.viewSelector; const Wanda = imports.ui.wanda; @@ -210,6 +211,9 @@ const Overview = new Lang.Class({ this.addSearchProvider(new DocDisplay.DocSearchProvider()); this.addSearchProvider(new ContactDisplay.ContactSearchProvider()); + // Load remote search providers provided by applications + RemoteSearch.loadRemoteSearchProviders(Lang.bind(this, this.addSearchProvider)); + // TODO - recalculate everything when desktop size changes this._dash = new Dash.Dash(); this._group.add_actor(this._dash.actor); diff --git a/js/ui/remoteSearch.js b/js/ui/remoteSearch.js index 18e57497a..c0aa985e6 100644 --- a/js/ui/remoteSearch.js +++ b/js/ui/remoteSearch.js @@ -1,11 +1,15 @@ // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- const Gio = imports.gi.Gio; +const GLib = imports.gi.GLib; const Lang = imports.lang; const St = imports.gi.St; +const FileUtils = imports.misc.fileUtils; const Search = imports.ui.search; +const KEY_FILE_GROUP = 'Shell Search Provider'; + const SearchProviderIface = @@ -28,6 +32,56 @@ const SearchProviderIface = var SearchProviderProxy = Gio.DBusProxy.makeProxyWrapper(SearchProviderIface); +function loadRemoteSearchProviders(addProviderCallback) { + let dataDirs = GLib.get_system_data_dirs(); + for (let i = 0; i < dataDirs.length; i++) { + let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', 'search-providers']); + let dir = Gio.file_new_for_path(path); + if (!dir.query_exists(null)) + continue; + loadRemoteSearchProvidersFromDir(dir, addProviderCallback); + } +}; + +function loadRemoteSearchProvidersFromDir(dir, addProviderCallback) { + let dirPath = dir.get_path(); + FileUtils.listDirAsync(dir, Lang.bind(this, function(files) { + for (let i = 0; i < files.length; i++) { + let keyfile = new GLib.KeyFile(); + let path = GLib.build_filenamev([dirPath, files[i].get_name()]); + + try { + keyfile.load_from_file(path, 0); + } catch(e) { + continue; + } + + if (!keyfile.has_group(KEY_FILE_GROUP)) + continue; + + let remoteProvider; + try { + let group = KEY_FILE_GROUP; + let title = keyfile.get_locale_string(group, 'Title', null); + let icon = keyfile.get_string(group, 'Icon'); + let busName = keyfile.get_string(group, 'BusName'); + let objectPath = keyfile.get_string(group, 'ObjectPath'); + + remoteProvider = new RemoteSearchProvider(title, + icon, + busName, + objectPath); + } catch(e) { + log('Failed to add search provider "%s": %s'.format(title, e.toString())); + continue; + } + + addProviderCallback(remoteProvider); + } + })); + +}; + const RemoteSearchProvider = new Lang.Class({ Name: 'RemoteSearchProvider', Extends: Search.SearchProvider,